/*
 * JDialogSeleccionComponente.java
 *
 * Created on 07-nov-2011, 9:25:35
 */
package com.ufps.cuatro.vistas.representacion;

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.HashMap;
import java.util.Observer;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.swing.tree.DefaultMutableTreeNode;

import org.jdesktop.application.Action;

import com.ufps.cuatro.CuatroApp;
import com.ufps.cuatro.controlador.UtilController;
import com.ufps.cuatro.controlador.render.UtilRender;
import com.ufps.cuatro.modelo.representacion.ObjetoTipoDatoReflexion;
import com.ufps.cuatro.modelo.representacion.UtilRepresentacion;
import com.ufps.cuatro.modelo.representacion.componente.Componente;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidor;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorExtra;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorGenerador;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorGeneradorString;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorGeneradorUnitario;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorIntegrador;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorModeloAsociado;
import com.ufps.cuatro.util.Bandera;
import com.ufps.cuatro.util.InformacionNodo;
import com.ufps.cuatro.util.MessageWindow;
import com.ufps.cuatro.util.Utileria;
import com.ufps.cuatro.util.generadores.GeneradorArbol;
import com.ufps.cuatro.util.wizard.UtilWizard;
import com.ufps.cuatro.vistas.asistente.espejo.complejo.wizard.JPanelWizardEspejoStandardSelectConfigFinish;
import com.ufps.cuatro.vistas.asistente.espejo.simple.wizard.JPanelWizardEspejoSimpleSelectElements;

/**
 * <i><b>JDialogSeleccionComponente:</b></i>Este Dialogo se encarga de
 * devolver un Componente que será utilizado para represetar un Modelo Asociado.  
 * 
 * @author Carlos A. Torres C. - Dolly E. Guerrero. <https://code.google.com/p/tesis4dor/>
 * @version 1.0 15/03/2011
 */
public class JDialogSeleccionComponente extends javax.swing.JDialog implements MessageWindow{
    private static final long serialVersionUID = 1580825277304832471L;
    
    /**
     * No especifica el uso de la Selección del Componente.
     */
    public final static int SELECCION_LIBRE = 0;
    /**
     * Indica que la Selección será utilizada posiblemente para la representación
     * de una llave (key) en una Colección que lo soporte Ej: Map ó Set.
     */
    public final static int SELECCION_COLECCION_KEY = 1;
    /**
     * Indica que la Selección será utilizada posiblemente para la representación
     * de un Objeto (object) en una Colección que lo soporte Ej: List, Map ó Set.
     */
    public final static int SELECCION_COLECCION_OBJECT = 2;
    
    private boolean selectionFromPatron = true;
    
    private Object objParent;
    private Object objSeleccionado;    
    private InformacionNodo objNodoSeleccionado;   
    private Componente objComponenteSeleccionado; 
    private ComponenteDistribuidorModeloAsociado objComponenteDistribuidorModeloAsociado;
    private ComponenteDistribuidorGeneradorUnitario objComponenteDistribuidorGeneradorUnitario;
    private ObjetoTipoDatoReflexion objTipoDato;        
    private ObjetoTipoDatoReflexion objTipoDatoParent;
    private int modo = SELECCION_LIBRE;
    private int[] tipoComponente = null;

    /** Creates new form JDialogSeleccionComponente
     * @param parent Referencia al Frame Parent.
     * @param modal  Modo de Exclusion en la Interfaz Gráfica.
     */
    public JDialogSeleccionComponente(java.awt.Frame parent, boolean modal) {
        super(parent, modal);
        initComponents();
        this.setIconImage(Utileria.leerIconoAppEnImagen(Utileria.MODO_16x16).getImage());
        this.crearEstructuraBibliotecaTrabajoPatron();
    }
    
    /**
     * <p>Crea el Dialogo para representar un Beans por medio de un Tipo de Dato
     * del Modelo Analizado.</p>
     * <p>Este Constructor limita la disponibilidad de Componentes para la selección.
     * teniendo en cuenta solo aquellos que soporte el Tipo de Dato recibido.</p>
     * @param objParent Referencia a la Ventana, Dialogo ó Vista Padre.
     * @param objTipoDato Tipo de Dato del Modelo Analizado.
     * @param modo  
     */
    public JDialogSeleccionComponente(final Object objParent, Componente objComponente, int modo) {
        super(CuatroApp.getApplication().getMainFrame(), true);        
        initComponents();        
        this.setIconImage(Utileria.leerIconoAppEnImagen(Utileria.MODO_16x16).getImage());
        this.modo = modo;
        this.objParent = objParent;        
        this.objComponenteSeleccionado = objComponente;
        if(objComponente instanceof ComponenteDistribuidorModeloAsociado){
            objComponenteDistribuidorModeloAsociado = (ComponenteDistribuidorModeloAsociado) objComponente;
            ComponenteDistribuidor objComponenteDistribuidor = objComponenteDistribuidorModeloAsociado.getObjComponenteDistribuidorObject();
            if(objComponenteDistribuidor instanceof ComponenteDistribuidorGenerador){
                int[] tipoTempComponente = {Componente.COMPONENTE_DISTRIBUIDOR_GENERADOR};
                tipoComponente = tipoTempComponente;
                ComponenteDistribuidorGenerador objComponenteDistribuidorGenerador = (ComponenteDistribuidorGenerador) objComponenteDistribuidor;
                this.objTipoDato = objComponenteDistribuidorGenerador.getObjTipoDato();
                cargarArbolPorTipoDato(true);
                UtilRender.helperIconLabelObjetoTipoDatoReflexion(jLabelTipoDato, objTipoDato);
            }
        }        
        this.crearEstructuraBibliotecaTrabajoPatron();
    }
    
    /**
     * <p>Crea el Dialogo para representar un Beans por medio de un Tipo de Dato
     * del Modelo Analizado.</p>
     * <p>Este Constructor limita la disponibilidad de Componentes para la selección.
     * teniendo en cuenta solo aquellos que soporte el Tipo de Dato recibido.</p>
     * @param objParent Referencia a la Ventana, Dialogo ó Vista Padre.
     * @param objTipoDato Tipo de Dato del Modelo Analizado.
     * @param modo  
     */
    public JDialogSeleccionComponente(final Object objParent, ObjetoTipoDatoReflexion objTipoDato, int modo) {
        super(CuatroApp.getApplication().getMainFrame(), true);        
        initComponents();        
        this.setIconImage(Utileria.leerIconoAppEnImagen(Utileria.MODO_16x16).getImage());
        this.modo = modo;
        this.objParent = objParent;        
        this.objTipoDato = objTipoDato;
        int[] tipoTempComponente = {Componente.COMPONENTE_DISTRIBUIDOR_GENERADOR};
        tipoComponente = tipoTempComponente;
        cargarArbolPorTipoDato();             
        UtilRender.helperIconLabelObjetoTipoDatoReflexion(jLabelTipoDato, objTipoDato);
        this.crearEstructuraBibliotecaTrabajoPatron();
    }
    
    public JDialogSeleccionComponente(final Object objParent, ObjetoTipoDatoReflexion objTipoDato, int modo, ObjetoTipoDatoReflexion objTipoDatoParent) {
        super(CuatroApp.getApplication().getMainFrame(), true);        
        initComponents();        
        this.setIconImage(Utileria.leerIconoAppEnImagen(Utileria.MODO_16x16).getImage());
        this.modo = modo;
        this.objParent = objParent;        
        this.objTipoDato = objTipoDato;
        this.objTipoDatoParent = objTipoDatoParent;
        int[] tipoTempComponente = {Componente.COMPONENTE_DISTRIBUIDOR_GENERADOR};
        tipoComponente = tipoTempComponente;
        cargarArbolPorTipoDato();             
        UtilRender.helperIconLabelObjetoTipoDatoReflexion(jLabelTipoDato, objTipoDato);
        this.crearEstructuraBibliotecaTrabajoPatron();                
    }
    
    /**
     * <p>Crea el Dialogo para representar un Beans por medio de un Componente.</p>
     * <p>Este Constructor permite disponibilidad total de Componentes para la selección.</p>
     * @param objParent Referencia a la Ventana, Dialogo ó Vista Padre.
     * @param objComponenteParent Componente.
     * @param modo  
     */
    public JDialogSeleccionComponente(final Object objParent, int modo) {
        super(CuatroApp.getApplication().getMainFrame(), true);
        initComponents();
        this.setIconImage(Utileria.leerIconoAppEnImagen(Utileria.MODO_16x16).getImage());
        this.modo = modo;
        this.objParent = objParent;                
        int[] tipoTempComponente = {Componente.COMPONENTE_DISTRIBUIDOR_EXTRA,Componente.COMPONENTE_DISTRIBUIDOR_GENERADOR, Componente.COMPONENTE_DISTRIBUIDOR_INTEGRADOR};        
        tipoComponente = tipoTempComponente;
        cargarArbolPorComponente(tipoComponente);                  
        UtilRender.helperIconInformationLabel(jLabelTipoDato, "Representación Libre");
        this.crearEstructuraBibliotecaTrabajoPatron();
    }    
    
    public JDialogSeleccionComponente(final Object objParent, int modo, int[] tipoComponente) {
        super(CuatroApp.getApplication().getMainFrame(), true);
        initComponents();
        this.setIconImage(Utileria.leerIconoAppEnImagen(Utileria.MODO_16x16).getImage());
        this.modo = modo;
        this.tipoComponente = tipoComponente;
        this.objParent = objParent;                        
        cargarArbolPorComponente(tipoComponente);                  
        UtilRender.helperIconInformationLabel(jLabelTipoDato, "Representación Libre");
        this.crearEstructuraBibliotecaTrabajoPatron();
    }    
    
    public JDialogSeleccionComponente(final Object objParent, int modo, int[] tipoComponente, int exclusion) {
        super(CuatroApp.getApplication().getMainFrame(), true);
        initComponents();
        this.setIconImage(Utileria.leerIconoAppEnImagen(Utileria.MODO_16x16).getImage());
        this.modo = modo;
        this.tipoComponente = tipoComponente;
        this.objParent = objParent;                        
        cargarArbolPorComponente(tipoComponente, exclusion);                  
        UtilRender.helperIconInformationLabel(jLabelTipoDato, "Representación Libre");
        this.crearEstructuraBibliotecaTrabajoPatron();
    }
    
    public JDialogSeleccionComponente(JPanelWizardEspejoStandardSelectConfigFinish objParent, int modo, int[] tipoComponente, int exclusion) {
        super(UtilWizard.objWizard.getDialog(), true);
        initComponents();
        this.setIconImage(Utileria.leerIconoAppEnImagen(Utileria.MODO_16x16).getImage());
        this.modo = modo;
        this.tipoComponente = tipoComponente;
        this.objParent = objParent;                        
        cargarArbolPorComponente(tipoComponente, exclusion);                  
        UtilRender.helperIconInformationLabel(jLabelTipoDato, "Representación Libre");
        agregarWindowListener(objParent, Componente.COMPONENTE_DISTRIBUIDOR_INTEGRADOR);
        this.crearEstructuraBibliotecaTrabajoPatron();
    }
    
    public JDialogSeleccionComponente(JPanelWizardEspejoSimpleSelectElements objParent, int modo, int[] tipoComponente) {
        super(UtilWizard.objWizard.getDialog(), true);
        initComponents();
        this.setIconImage(Utileria.leerIconoAppEnImagen(Utileria.MODO_16x16).getImage());
        this.modo = modo;
        this.tipoComponente = tipoComponente;
        this.objParent = objParent;                        
        cargarArbolPorComponente(tipoComponente);                  
        UtilRender.helperIconInformationLabel(jLabelTipoDato, "Representación Libre");
        agregarWindowListener(objParent, Componente.COMPONENTE_DISTRIBUIDOR_GENERADOR);
        this.crearEstructuraBibliotecaTrabajoPatron();
        this.selectionFromPatron = true;
    }
    
    private void agregarWindowListener(final Object objParent, final int modo) {
        this.addWindowListener(new WindowAdapter() {
            @Override
            public void windowOpened(WindowEvent e) {
                super.windowOpened(e);
                switch(modo){
                    case Componente.COMPONENTE_DISTRIBUIDOR_INTEGRADOR:
                        if(UtilRepresentacion.objBibliotecaTrabajoLocal.getObjComponentesIntegradores().isEmpty()){
                            msgWarning("No existen Representaciones Disponibles para Incluir.");                                        
                            Bandera objBandera = new Bandera();
                            objBandera.addObserver((Observer) objParent);
                            objBandera.setEstado(Bandera.PROCESO_CANCELADO);            
                            objBandera.notificar();
                            objBandera.setObj(null);
                            dispose();                 
                        }
                        break;
                    case Componente.COMPONENTE_DISTRIBUIDOR_GENERADOR:
                        if(UtilRepresentacion.objBibliotecaTrabajoLocal.getObjComponentesGeneradores().isEmpty()){
                            msgWarning("No existen Representaciones Disponibles para Incluir.");                                        
                            Bandera objBandera = new Bandera();
                            objBandera.addObserver((Observer) objParent);
                            objBandera.setEstado(Bandera.PROCESO_CANCELADO);            
                            objBandera.notificar();
                            objBandera.setObj(null);
                            dispose();                 
                        }
                        break;
                }
                                                 
            }
        });
    }
    
    private void cargarArbolPorComponente(int[] tipoComponente) {        
        this.tipoComponente = tipoComponente;
        DefaultMutableTreeNode objRaiz = GeneradorArbol.crearEstructuraBibliotecaPersonalizada(
                "Biblioteca", 
                UtilRepresentacion.objBibliotecaTrabajoLocal, 
                tipoComponente);                
        UtilRender.helperRenderJTree(jTreeComponentesUsuario, objRaiz, Utileria.ARBOL_BIBLIOTECA, true, 0);
        UtilRender.helperIconInformationLabel(jLabelTipoDato, "Representación Libre");
    }       
    
    private void cargarArbolPorComponente(int[] tipoComponente, int exclusion) {        
        DefaultMutableTreeNode objRaiz = GeneradorArbol.crearEstructuraBibliotecaPersonalizada(
                "Biblioteca", 
                UtilRepresentacion.objBibliotecaTrabajoLocal, 
                tipoComponente, exclusion);                
        UtilRender.helperRenderJTree(jTreeComponentesUsuario, objRaiz, Utileria.ARBOL_BIBLIOTECA, true, 0);
        UtilRender.helperIconInformationLabel(jLabelTipoDato, "Representación Libre");
    }
    
    private void cargarArbolPorTipoDato() {
        DefaultMutableTreeNode objRaiz = GeneradorArbol.crearEstructuraBibliotecaPersonalizadaPorTipoDato(
                "Representaciones Soportadas", 
                UtilRepresentacion.objBibliotecaTrabajoLocal, objTipoDato);                
        UtilRender.helperRenderJTree(jTreeComponentesUsuario, objRaiz, Utileria.ARBOL_BIBLIOTECA, true, 0);
    }
    
    private void cargarArbolPorTipoDato(boolean modeInOut) {
        DefaultMutableTreeNode objRaiz = GeneradorArbol.crearEstructuraBibliotecaPersonalizadaPorTipoDato(
                "Representaciones Soportadas", 
                UtilRepresentacion.objBibliotecaTrabajoLocal, objTipoDato, modeInOut);                
        UtilRender.helperRenderJTree(jTreeComponentesUsuario, objRaiz, Utileria.ARBOL_BIBLIOTECA, true, 0);
    }
    
    private void crearEstructuraBibliotecaTrabajoPatron(){
        try{
            DefaultMutableTreeNode objRaiz = 
                    GeneradorArbol.crearEstructuraBibliotecaPatron("Modelo Analizado - Representaciones", UtilRepresentacion.objBibliotecaTrabajoLocal, true);                                   
            //crearEstructuraBibliotecaAll
            if(objRaiz == null){                    
                objRaiz = GeneradorArbol.crearNodo("Vista No Disponible.");
            }
            UtilRender.helperRenderJTree(jTreeComponentesPatron, objRaiz, Utileria.ARBOL_BIBLIOTECA, true, 0);            
        } catch (java.lang.NullPointerException ex) {
            Logger.getLogger(JDialogSeleccionComponente.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jToolBar1 = new javax.swing.JToolBar();
        jButtonOk = new javax.swing.JButton();
        jSeparator1 = new javax.swing.JToolBar.Separator();
        jButtonCancelar = new javax.swing.JButton();
        jSeparator2 = new javax.swing.JToolBar.Separator();
        jButton1 = new javax.swing.JButton();
        jLabelInfo = new javax.swing.JLabel();
        jLabel1 = new javax.swing.JLabel();
        jLabelTipoDato = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        jTabbedPane1 = new javax.swing.JTabbedPane();
        jScrollPane1 = new javax.swing.JScrollPane();
        jTreeComponentesUsuario = new javax.swing.JTree();
        jScrollPane2 = new javax.swing.JScrollPane();
        jTreeComponentesPatron = new javax.swing.JTree();
        jLabel2 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance().getContext().getResourceMap(JDialogSeleccionComponente.class);
        setTitle(resourceMap.getString("Form.title")); // NOI18N
        setName("Form"); // NOI18N
        setResizable(false);

        jToolBar1.setFloatable(false);
        jToolBar1.setRollover(true);
        jToolBar1.setName("jToolBar1"); // NOI18N

        javax.swing.ActionMap actionMap = org.jdesktop.application.Application.getInstance().getContext().getActionMap(JDialogSeleccionComponente.class, this);
        jButtonOk.setAction(actionMap.get("aceptar")); // NOI18N
        jButtonOk.setFocusable(false);
        jButtonOk.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButtonOk.setName("jButtonOk"); // NOI18N
        jButtonOk.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jToolBar1.add(jButtonOk);

        jSeparator1.setName("jSeparator1"); // NOI18N
        jToolBar1.add(jSeparator1);

        jButtonCancelar.setAction(actionMap.get("cancelar")); // NOI18N
        jButtonCancelar.setFocusable(false);
        jButtonCancelar.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButtonCancelar.setName("jButtonCancelar"); // NOI18N
        jButtonCancelar.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jToolBar1.add(jButtonCancelar);

        jSeparator2.setName("jSeparator2"); // NOI18N
        jToolBar1.add(jSeparator2);

        jButton1.setAction(actionMap.get("help")); // NOI18N
        jButton1.setFocusable(false);
        jButton1.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButton1.setName("jButton1"); // NOI18N
        jButton1.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jToolBar1.add(jButton1);

        jLabelInfo.setBackground(resourceMap.getColor("jLabelInfo.background")); // NOI18N
        jLabelInfo.setText(resourceMap.getString("jLabelInfo.text")); // NOI18N
        jLabelInfo.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        jLabelInfo.setName("jLabelInfo"); // NOI18N
        jLabelInfo.setOpaque(true);

        jLabel1.setText(resourceMap.getString("jLabel1.text")); // NOI18N
        jLabel1.setName("jLabel1"); // NOI18N

        jLabelTipoDato.setBackground(resourceMap.getColor("jLabelTipoDato.background")); // NOI18N
        jLabelTipoDato.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabelTipoDato.setText(resourceMap.getString("jLabelTipoDato.text")); // NOI18N
        jLabelTipoDato.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        jLabelTipoDato.setName("jLabelTipoDato"); // NOI18N
        jLabelTipoDato.setOpaque(true);

        jLabel3.setBackground(resourceMap.getColor("jLabel3.background")); // NOI18N
        jLabel3.setIcon(resourceMap.getIcon("jLabel3.icon")); // NOI18N
        jLabel3.setText(resourceMap.getString("jLabel3.text")); // NOI18N
        jLabel3.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        jLabel3.setName("jLabel3"); // NOI18N
        jLabel3.setOpaque(true);

        jTabbedPane1.setName("jTabbedPane1"); // NOI18N

        jScrollPane1.setName("jScrollPane1"); // NOI18N

        jTreeComponentesUsuario.setName("jTreeComponentesUsuario"); // NOI18N
        jTreeComponentesUsuario.addTreeSelectionListener(new javax.swing.event.TreeSelectionListener() {
            public void valueChanged(javax.swing.event.TreeSelectionEvent evt) {
                jTreeComponentesUsuarioValueChanged(evt);
            }
        });
        jScrollPane1.setViewportView(jTreeComponentesUsuario);

        jTabbedPane1.addTab(resourceMap.getString("jScrollPane1.TabConstraints.tabTitle"), jScrollPane1); // NOI18N

        jScrollPane2.setName("jScrollPane2"); // NOI18N

        jTreeComponentesPatron.setName("jTreeComponentesPatron"); // NOI18N
        jTreeComponentesPatron.addTreeSelectionListener(new javax.swing.event.TreeSelectionListener() {
            public void valueChanged(javax.swing.event.TreeSelectionEvent evt) {
                jTreeComponentesPatronValueChanged(evt);
            }
        });
        jScrollPane2.setViewportView(jTreeComponentesPatron);

        jTabbedPane1.addTab(resourceMap.getString("jScrollPane2.TabConstraints.tabTitle"), jScrollPane2); // NOI18N

        jLabel2.setText(resourceMap.getString("jLabel2.text")); // NOI18N
        jLabel2.setName("jLabel2"); // NOI18N

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jLabel3, javax.swing.GroupLayout.DEFAULT_SIZE, 405, Short.MAX_VALUE)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jToolBar1, javax.swing.GroupLayout.DEFAULT_SIZE, 385, Short.MAX_VALUE)
                .addContainerGap())
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel1)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jLabelTipoDato, javax.swing.GroupLayout.DEFAULT_SIZE, 314, Short.MAX_VALUE)
                .addContainerGap())
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jTabbedPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 385, Short.MAX_VALUE)
                .addContainerGap())
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel2, javax.swing.GroupLayout.DEFAULT_SIZE, 385, Short.MAX_VALUE)
                .addContainerGap())
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabelInfo, javax.swing.GroupLayout.DEFAULT_SIZE, 385, Short.MAX_VALUE)
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE, 79, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jToolBar1, javax.swing.GroupLayout.PREFERRED_SIZE, 41, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(jLabelTipoDato))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jTabbedPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 247, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jLabel2)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jLabelInfo)
                .addContainerGap())
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void jTreeComponentesUsuarioValueChanged(javax.swing.event.TreeSelectionEvent evt) {//GEN-FIRST:event_jTreeComponentesUsuarioValueChanged
        DefaultMutableTreeNode node = (DefaultMutableTreeNode) (evt.getPath().getLastPathComponent());
        Object nodeInfo = node.getUserObject();        
        try {
            this.objNodoSeleccionado = (InformacionNodo) nodeInfo;
            if(this.objNodoSeleccionado.getObjElemento() == null){                             
                return;
            }
            this.objSeleccionado = this.objNodoSeleccionado.getObjElemento();
            if (node.isRoot()) {
                //El nodo seleccionado es la raiz del arbol                                                
            } else if (node.isLeaf()) {
                //El nodo seleccionado es una hoja                                                
            } else {
                //El nodo seleccionado es una rama                           
            }            
            if(objSeleccionado instanceof ComponenteDistribuidor){
                objComponenteSeleccionado = (ComponenteDistribuidor) objSeleccionado;                
            }
            else{
                objComponenteSeleccionado = null;
            }
            UtilRender.helperIconLabel(jLabelInfo, objSeleccionado);
            UtilRender.createPopupMenuObjectSeleccionado(this, jTreeComponentesUsuario, objSeleccionado);                                   
        } catch (java.lang.ClassCastException ex) {
            Logger.getLogger(JDialogSeleccionComponente.class.getName()).log(Level.SEVERE, null, ex);            
        }
    }//GEN-LAST:event_jTreeComponentesUsuarioValueChanged

    private void jTreeComponentesPatronValueChanged(javax.swing.event.TreeSelectionEvent evt) {//GEN-FIRST:event_jTreeComponentesPatronValueChanged
        if(this.selectionFromPatron){
            DefaultMutableTreeNode node = (DefaultMutableTreeNode) (evt.getPath().getLastPathComponent());
            Object nodeInfo = node.getUserObject();        
            try {
                this.objNodoSeleccionado = (InformacionNodo) nodeInfo;
                if(this.objNodoSeleccionado.getObjElemento() == null){                             
                    return;
                }
                this.objSeleccionado = this.objNodoSeleccionado.getObjElemento();
                if (node.isRoot()) {
                    //El nodo seleccionado es la raiz del arbol                                                
                } else if (node.isLeaf()) {
                    //El nodo seleccionado es una hoja                                                
                } else {
                    //El nodo seleccionado es una rama                           
                }            
                if(objSeleccionado instanceof ComponenteDistribuidor){
                    objComponenteSeleccionado = (ComponenteDistribuidor) objSeleccionado;                
                }
                else{
                    objComponenteSeleccionado = null;
                }
                UtilRender.helperIconLabel(jLabelInfo, objSeleccionado);
                UtilRender.createPopupMenuObjectSeleccionado(this, jTreeComponentesPatron, objSeleccionado);                                   
            } catch (java.lang.ClassCastException ex) {
                Logger.getLogger(JDialogSeleccionComponente.class.getName()).log(Level.SEVERE, null, ex);            
            }
        }
    }//GEN-LAST:event_jTreeComponentesPatronValueChanged

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(JDialogSeleccionComponente.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(JDialogSeleccionComponente.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(JDialogSeleccionComponente.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(JDialogSeleccionComponente.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the dialog */
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                JDialogSeleccionComponente dialog = new JDialogSeleccionComponente(new javax.swing.JFrame(), true);
                dialog.addWindowListener(new java.awt.event.WindowAdapter() {

                    @Override
                    public void windowClosing(java.awt.event.WindowEvent e) {
                        System.exit(0);
                    }
                });
                dialog.setVisible(true);
            }
        });
    }

    public Componente getObjComponenteSeleccionado() {
        return objComponenteSeleccionado;
    }
    
    private boolean isValidSelectedComponent(){
        if(objComponenteDistribuidorModeloAsociado != null){
            ComponenteDistribuidor objComponenteDistribuidor = objComponenteDistribuidorModeloAsociado.getObjComponenteDistribuidorObject();
            if(objComponenteDistribuidor.equals(objComponenteSeleccionado)){
                msgWarning("El Componente Seleccionado es la Representación Actual del Modelo Asociado.\nDebe Seleccionar otro si quiere Actualizarla.");
                return false;
            }
            if(objComponenteSeleccionado instanceof ComponenteDistribuidorGenerador){
                if(objComponenteSeleccionado instanceof ComponenteDistribuidorGeneradorString){                
                    msgWarning("No se pueden seleccionar Representaciones Simplificiadas para un Modelo Asociado.");
                    return false;
                }
                ComponenteDistribuidorGenerador objComponenteDistribuidorGenerador = (ComponenteDistribuidorGenerador) objComponenteSeleccionado;
                ObjetoTipoDatoReflexion objTipoDatoSeleccionado = objComponenteDistribuidorGenerador.getObjTipoDato();
                if(!objTipoDato.equals(objTipoDatoSeleccionado)){
                    msgWarning("Solo Puede seleccionar representaciones del mismo tipo soportado por el Modelo Asociado.\n"
                            + "Tipo Sportado: " + objTipoDato.getStrClassPath());
                    return false;
                }
            }
            else{
                msgWarning("Solo Puede seleccionar representaciones del mismo tipo soportado por el Modelo Asociado.\n"
                            + "Tipo Sportado: " + objTipoDato.getStrClassPath());
                return false;
            }
        }
        else if(objTipoDatoParent != null){//se esta creando un componente generador manual con modelo asociado
           if(objComponenteSeleccionado instanceof ComponenteDistribuidorGenerador){
                if(objComponenteSeleccionado instanceof ComponenteDistribuidorGeneradorString){                
                    msgWarning("No se pueden seleccionar Representaciones Simplificiadas para un Modelo Asociado.");
                    return false;
                }
                ComponenteDistribuidorGenerador objComponenteDistribuidorGenerador = (ComponenteDistribuidorGenerador) objComponenteSeleccionado;
                ObjetoTipoDatoReflexion objTipoDatoSeleccionado = objComponenteDistribuidorGenerador.getObjTipoDato();
                if(!objTipoDato.equals(objTipoDatoSeleccionado)){
                    msgWarning("Solo Puede seleccionar representaciones del mismo tipo soportado por el Modelo Asociado.\n"
                            + "Tipo Sportado: " + objTipoDato.getStrClassPath());
                    return false;
                }
            }
            else{
                msgWarning("Solo Puede seleccionar representaciones del mismo tipo soportado por el Modelo Asociado.\n"
                            + "Tipo Sportado: " + objTipoDato.getStrClassPath());
                return false;
            } 
        }
        boolean evalTipoComponente = false;
        for(int i : tipoComponente){
            switch(i){
                case Componente.COMPONENTE_DISTRIBUIDOR_EXTRA:                    
                    evalTipoComponente = (objComponenteSeleccionado instanceof ComponenteDistribuidorExtra) ? true : false;
                    break;
                case Componente.COMPONENTE_DISTRIBUIDOR_GENERADOR:
                    evalTipoComponente = (objComponenteSeleccionado instanceof ComponenteDistribuidorGenerador) ? true : false;
                    break;
                case Componente.COMPONENTE_DISTRIBUIDOR_INTEGRADOR:                    
                    evalTipoComponente = (objComponenteSeleccionado instanceof ComponenteDistribuidorIntegrador) ? true : false;
                    break;
            }
        }
        if(!evalTipoComponente){
            msgWarning("El Componente Seleccionado No Cumple con el Tipo Esperado.");
        }
        return evalTipoComponente;
    }   

    /**
     * Devuelve la Represetnación Seleccionada.
     */
    @Action
    public void aceptar() {
        if(objComponenteSeleccionado == null){
            msgWarning("Debe Seleccionar un Componente Principal.");
            return;
        }        
        if(!objComponenteSeleccionado.isIncluido()){
            msgWarning("No se puede Seleccionar un Componente que no ha sido incluido en la Representación.\n"
                    + "Para poder Seleccionarlo Incluyalo nuevamente.\n"
                    + "(Ver Menu de Opciones con Click derecho sobre el Componente).");
            return;
        } 
        if(!isValidSelectedComponent()){            
            return;
        }
        if(objComponenteSeleccionado instanceof ComponenteDistribuidorGenerador){
            if(UtilRepresentacion.objBibliotecaTrabajoLocal.isIncludedIntoRepresentation((ComponenteDistribuidorGenerador)objComponenteSeleccionado)){
                msgWarning("No Puede Seleccionar Componentes que han sido generados\n" +
                        "con dependencias para una Representación (Ej: Propiedades de Clases ó Métodos).");
                return;
            }           
        }
        if(msgConfirm("¿Acepta la Selección del Componente?")){             
            String strOpcion = "";            
            if(objComponenteDistribuidorModeloAsociado != null){                
                Bandera objBandera = new Bandera();
                objBandera.addObserver((Observer)objParent);
                switch(modo){
                    case JDialogSeleccionComponente.SELECCION_COLECCION_KEY:
                        objComponenteDistribuidorModeloAsociado.setObjComponenteDistribuidorKey((ComponenteDistribuidor)objComponenteSeleccionado);
                        objBandera.setEstado(Bandera.UPDATE_COMPONENTE_KEY_ASOCIATE_MODEL);
                        break;
                    case JDialogSeleccionComponente.SELECCION_COLECCION_OBJECT:
                        objComponenteDistribuidorModeloAsociado.setObjComponenteDistribuidorObject((ComponenteDistribuidor)objComponenteSeleccionado);
                        objBandera.setEstado(Bandera.UPDATE_COMPONENTE_OBJECT_ASOCIATE_MODEL);
                        break;
                }                
                objBandera.setObj(objComponenteSeleccionado);
                objBandera.notificar();
                dispose();
            }
            else{
                switch(modo){
                    case JDialogSeleccionComponente.SELECCION_COLECCION_KEY:
                        strOpcion = Bandera.OPC_SELECCION_COMPONENTE_DISTRIBUIDOR_KEY;
                        break;
                    case JDialogSeleccionComponente.SELECCION_COLECCION_OBJECT:
                        strOpcion = Bandera.OPC_SELECCION_COMPONENTE_DISTRIBUIDOR_OBJECT;    
                        break;
                }
                HashMap<String, Object> objOpciones = new HashMap<String, Object>();
                if(strOpcion.isEmpty()){                
                    if(UtilController.notificarObservador((Observer) objParent, objComponenteSeleccionado, Bandera.SELECCION_COMPONENTE_DISTRIBUIDOR, objOpciones)){
                        dispose();
                    }
                }
                else{                                                
                    objOpciones.put(strOpcion, true);
                    if(UtilController.notificarObservador((Observer) objParent, objComponenteSeleccionado, Bandera.SELECCION_COMPONENTE_DISTRIBUIDOR, objOpciones)){
                        dispose();
                    }
                }
            }
        }
    }

    /**
     * Cancela el Proceso.
     */
    @Action
    public void cancelar() {
        if(msgConfirm("¿Desea Cerrar la Ventana?")){             
            if(UtilController.notificarObservador((Observer) objParent, Bandera.PROCESO_CANCELADO)){
                dispose();
            }
        }
    }

    /**
     * Visualiza la Ayuda Asociada.
     */
    @Action
    public void help() {
        UtilRender.openDialogHelp(JDialogSeleccionComponente.class, getTitle());
    }
    
    public boolean msgConfirm(String strMsg) {
        if(objParent instanceof JPanelWizardEspejoStandardSelectConfigFinish ||
                objParent instanceof JPanelWizardEspejoSimpleSelectElements){
            return UtilRender.msgConfirmar(strMsg, UtilWizard.objWizard.getDialog());
        }
        else{
            return UtilRender.msgConfirmar(strMsg);
        }
    }

    public void msgInfo(String strMsg) {
        if(objParent instanceof JPanelWizardEspejoStandardSelectConfigFinish ||
                objParent instanceof JPanelWizardEspejoSimpleSelectElements){
            UtilRender.msgInformacion(strMsg, UtilWizard.objWizard.getDialog());
        }
        else{
            UtilRender.msgInformacion(strMsg);
        }
    }

    public void msgWarning(String strMsg) {
        if(objParent instanceof JPanelWizardEspejoStandardSelectConfigFinish ||
                objParent instanceof JPanelWizardEspejoSimpleSelectElements){
            UtilRender.msgAdvertencia(strMsg, UtilWizard.objWizard.getDialog());
        }
        else{
            UtilRender.msgAdvertencia(strMsg);
        }
    }

    public void msgError(String strMsg) {
        if(objParent instanceof JPanelWizardEspejoStandardSelectConfigFinish ||
                objParent instanceof JPanelWizardEspejoSimpleSelectElements){
            UtilRender.msgError(strMsg, UtilWizard.objWizard.getDialog());
        }
        else{
            UtilRender.msgError(strMsg);
        }
    }
    
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButtonCancelar;
    private javax.swing.JButton jButtonOk;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabelInfo;
    private javax.swing.JLabel jLabelTipoDato;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JToolBar.Separator jSeparator1;
    private javax.swing.JToolBar.Separator jSeparator2;
    private javax.swing.JTabbedPane jTabbedPane1;
    private javax.swing.JToolBar jToolBar1;
    private javax.swing.JTree jTreeComponentesPatron;
    private javax.swing.JTree jTreeComponentesUsuario;
    // End of variables declaration//GEN-END:variables
}